package se;

/**
 * .就近原则
 * .变量的分类
 * 成员变量：类变量，实例变量
 * 局部变量
 * .非静态代码块执行：每次创建实例对象都执行
 * .方法的调用规则：调用一次执行一次
 * <p>
 * 局部变量与成员变量区别：
 * 1.声明位置：局部变量：方法体{}中，形参，代码块{}中
 * 成员变量：类中方法外，类变量(有static修饰)，实例变量(没有static)
 * 2.修饰符：局部变量：final
 * 成员变量：public protected private final static volatile transient
 * 3.值存储位置：局部变量：栈
 * 实例变量：堆
 * 类变量：方法区
 * 4.作用域：局部变量：从声明开始到所属的 }  结束
 * 实例变量：在当前类中“this.”(可缺省)，在其他类中“对象名.”访问
 * 类变量：在当前类中“类名.”（可缺省），在其他类中“类名.”或“对象名.”访问
 * 5.生命周期：局部变量：每个线程，每一次调用执行都是新的生命周期
 * 实例变量：每个对象的实例变量都是独立的。随着对象的创建而初始化，随着对象的被回收而死亡，
 * 类变量：该类的所有对象的类变量是共享的。随着对象的创建而初始化，随着对象的被回收而死亡，
 * <p>
 * 局部变量与xx变量重名时如何区别：
 * 1.与实例变量：在实例变量前加“this.”
 * 2.与类变量：在类变量前“加类名.”
 * <p>
 * 堆：存放对象实例以及数组
 * 栈(虚拟机栈)：局部变量表中存储基本数据类型，对象引用类型
 * 方法区：被虚拟机加载的类信息，常量，静态变量，即使编译后的代码数据
 */
public class Demo4 {

    static int s;//成员变量：类变量
    int i;//成员变量：实例变量
    int j;//成员变量

    {
        int i = 1;//非惊代码块 局部变量i
        i++;
        j++;
        s++;
    }

    public void test(int j) {//形参 局部变量j
        j++;
        i++;
        s++;
    }

    public static void main(String[] args) {
        Demo4 obj1 = new Demo4();//局部变量obj1
        Demo4 obj2 = new Demo4();//局部变量obj2
        obj1.test(10);
        obj1.test(20);
        obj2.test(30);
        System.out.println(obj1.i + "," + obj1.j + "," + obj1.s);
        System.out.println(obj2.i + "," + obj2.j + "," + obj2.s);
    }
}
